import numpy as np
import open3d as o3d

# 1. 加载.npy文件
# file_path = "E:\\data\\3DpointCloud\\s3dis\\trainval_fullarea\\Area_1_conferenceRoom_1.npy"  # 替换为你的文件路径
# file_path = "E:\\data\\3DpointCloud\\s3dis\\trainval_fullarea\\Area_1_office_1.npy" 
# file_path = "E:\\data\\3DpointCloud\\s3dis\\trainval_fullarea\\Area_1_conferenceRoom_1.npy"
# file_path = "E:\\data\\3DpointCloud\\s3dis\\trainval_fullarea\\Area_1_hallway_1.npy"
# file_path = "E:\\data\\3DpointCloud\\s3dis\\trainval_fullarea\\Area_2_auditorium_1.npy"
file_path = "E:\\data\\3DpointCloud\\s3dis\\trainval_fullarea\\Area_5_office_26.npy"

data = np.load(file_path)

# 2. 检查数据格式
print("数据形状 (N, C):", data.shape)  # 通常为 (N, 6) 或 (N, 9)
print("前5个点:\n", data[:5])  # 查看数据样例

# 3. 提取坐标和颜色（假设数据格式为 [x,y,z,r,g,b,...]）
points = data[:, :3]  # 前3列为坐标
colors = data[:, 3:6] / 255.0  # RGB归一化到[0,1]（Open3D要求）

# 4. 创建Open3D点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)  # 设置点坐标
pcd.colors = o3d.utility.Vector3dVector(colors)  # 设置点颜色

# 5. 可选：下采样（如果点云过大）
if len(points) > 100000:
    pcd = pcd.voxel_down_sample(voxel_size=0.05)  # 体素下采样，调整voxel_size控制密度

# 6. 可视化设置
vis = o3d.visualization.Visualizer()
vis.create_window(window_name=f"S3DIS点云查看: {file_path}", width=800, height=600)
vis.add_geometry(pcd)

# 设置渲染选项（更清晰的点）
opt = vis.get_render_option()
opt.point_size = 1.5  # 点大小
opt.background_color = np.array([0.1, 0.1, 0.1])  # 背景设为深灰色

# 7. 添加坐标系（可选）
coordinate_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=1.0, origin=[0, 0, 0])
vis.add_geometry(coordinate_frame)

# 8. 运行可视化
vis.run()
vis.destroy_window()